package com.xianggu.reflect;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Method;

public class MethodHandleDemo {

    // 目标类定义
    static class HandleTarget {
        // 构造函数
        public HandleTarget() {
            System.out.println("默认构造函数调用");
        }

        // 静态方法
        public static String staticMethod(String author) {
            return author + "：静者心多妙";
        }

        // 私有方法
        private void privateMethod(String message) {
            System.out.println("私有方法调用：" + message);
        }

        // 实例方法
        public void instanceMethod(int value) {
            System.out.println("实例方法调用，参数：" + value);
        }
    }

    public static void main(String[] args) throws Throwable {
        MethodHandles.Lookup lookup = MethodHandles.lookup();

        // 1. 调用构造函数
        MethodType constructorType = MethodType.methodType(void.class);
        MethodHandle constructor = lookup.findConstructor(HandleTarget.class, constructorType);
        HandleTarget obj = (HandleTarget) constructor.invokeExact();
        System.out.println("对象创建成功：" + obj);

        // 2. 调用静态方法
        MethodType staticMethodType = MethodType.methodType(String.class, String.class);
        MethodHandle staticMh = lookup.findStatic(HandleTarget.class, "staticMethod", staticMethodType);
        String result = (String) staticMh.invokeExact("李白");
        System.out.println("静态方法结果：" + result);

        // 3. 调用私有方法（需反射解除限制）
        Method privateMethod = HandleTarget.class.getDeclaredMethod("privateMethod", String.class);
        privateMethod.setAccessible(true);
        MethodHandle privateMh = lookup.unreflect(privateMethod);
        privateMh.invokeExact(obj, "秘密操作");

        // 4. 调用实例方法
        MethodType instanceMethodType = MethodType.methodType(void.class, int.class);
        MethodHandle instanceMh = lookup.findVirtual(HandleTarget.class, "instanceMethod", instanceMethodType);
        instanceMh.invokeExact(obj, 100);
    }
}